#lang rosetta-racket


(require "truss.rkt")

(provide moebius-cs
         moebius-truss)


; utils

(define (enumerate-n fn a b n)
  (map fn (: < a .. < (+ n 1) > .. b >)))

(define (enumerate-m-n fn u1 u2 m v1 v2 n)
  (enumerate-n
   (λ (u) (enumerate-n (λ (v) (fn u v)) v1 v2 n))
   u1 u2 m))


; moebius truss

(define (moebius-cs u1 u2 m v1 v2 n)
  (enumerate-m-n
   (λ (u v)
     (cyl (* 4 (+ 1 (* v (cos (/2 u)))))
          u
          (* 4 (* v (sin (/2 u))))))
   u1 u2 m v1 v2 n))

(define (moebius-truss u1 u2 m v1 v2 n)
  (spatial-truss-insert-apex (moebius-cs u1 u2 m v1 v2 n)))